
main(){
  printInfo("cc",11);
  printInfo("waterkid");
  
  
  printInfo02("cc",age: 22,height: 111);
  printInfo02("name");


  test(foo);

  Function f = getFunc();
  print(f);
  f();



  /**
   * 匿名函数
   */

  List<String> names = ["aa","cc","dd"];

  names.forEach(printItem);
  // 匿名函数
  names.forEach((item){
    print(item);
  });

  // 如果函数只有一行简单的代码 ===> 仅限于只有一行简单的代码
  names.forEach((item)=>printItem(item));


  // 返回 tuple
 final result = names.map((item)=>item+"a");


 // 转换成List
 List<String> newNames = List.from(result);

 print(newNames);


  /**
   * 词法作用域
   */
 void foo01(){
   // 先在自己的作用域中找，，然后往上找，，最后没找到会报错
   print(names);
 }

  /**
   * 词法闭包
   */


  /**
   * 函数没有设置返回类型，，默认返回的是 null
   */

  print(test02());





}

test02(){
  print("123");
}

void printItem(value){
  print(value);
}



int sum(int num1,int num2){
  return num1+num2;
}


/**
 * dart中函数的参数：
 *     必传参数
 *     可选参数
 *        1. 位置可选参数   []
 *        2. 命名的可选参数  {}
 *
 *
 *
 *        默认值只能给可选参数，，，必传参数不能写默认值
 */

void printInfo(String name,[int? age=1,double? height=1]){
  print("$name $age $height");
}


void printInfo02(String name,{int? age,double? height}){
  print("$name $age $height");
}

/**
 * 函数第一公民
 *
 *    把函数当作参数传入
 *
 *
 *    函数作为第一公民：  函数可以作为另一个函数的参数，，也可以作为另一个函数的返回值
 */

void foo(){
  print("hello world");
}


void test(Function func){
  func();
}


Function getFunc(){
  return foo;
}

